#include <sys/statfs.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

enum EMDiskSizeType
{
    TOTAL_SIZE, // 全部空间
    FREE_SIZE     // 剩余空间
};


//*****************************************************************************
//@Function                : 统计指定路径所在磁盘的大小
//@in                     : strDir 指定路径
//@in                    : diskType 指定需要的磁盘大小类型，TOTAL_SIZE：总大小
//FREE_SIZE：剩余大小
//@Description            : 返回指定路径所在磁盘的大小，单位MB
//*****************************************************************************

unsigned long long GetDiskSize(int fd,long long diskType)//返回指定路径所在磁盘的大小，单位MB
//unsigned long long GetDiskSize(char* strDir,long long diskType)//返回指定路径所在磁盘的大小，单位MB
{
    unsigned long long llCount = 0;
    struct statfs diskInfo;//  statfs是查询文件系统相关信息的系统自带的结构体和函数存放在#include <sys/statfs.h>
      if (fstatfs(fd, &diskInfo)== -1)//fd： 需要查询信息的文件系统的文件描述词。
    //if (statfs(strDir, &diskInfo) == -1)//strDir 指定路径
    {
        printf( "getdisksize error, errno : %d, error : %s", errno, strerror(errno));
        llCount = 0;
    }
    else
    {
        switch(diskType)
        {
            case TOTAL_SIZE:
                llCount = diskInfo.f_bsize * diskInfo.f_blocks; //  long f_bsize经过优化的传输块大小; long f_blocks; 文件系统数据块总数 
                llCount = llCount >> 20;
                break;
            case FREE_SIZE:
                llCount = diskInfo.f_bsize * diskInfo.f_bfree;//  long f_bsize经过优化的传输块大小; //  long f_bfree;  可用块数 
                llCount = llCount >> 20;
                break;
            default:
                llCount = 0;
                break;
        }
    }
    return llCount;
}
int main(int argc, const char *argv[])
{
   long long disk=0;
    int fd = open("./11.txt", O_RDWR);
    if(fd == -1)
    {
        printf("打开文件失败\n");
    }
 //  disk= GetDiskSize("/home",TOTAL_SIZE);
 disk= GetDiskSize(fd,TOTAL_SIZE);
   if(disk>60000){
   printf("===%lld====",disk);
   }

    return 0;
}


//  fd： 需要查询信息的文件系统的文件描述词。

//     buf：以下结构体的指针变量，用于储存文件系统相关的信息

//     struct statfs {

//         long f_type; /* 文件系统类型 */

//        long f_bsize; /* 经过优化的传输块大小 */

//        long f_blocks; /* 文件系统数据块总数 */

//        long f_bfree; /* 可用块数 */

//        long f_bavail; /* 非超级用户可获取的块数 */

//        long f_files; /* 文件结点总数 */

//        long f_ffree; /* 可用文件结点数 */

//        fsid_t f_fsid; /* 文件系统标识 */

//         long f_namelen; /* 文件名的最大长度 */

//     };

// 返回说明：
//     成功执行时，返回0。失败返回-1，errno被设为以下的某个值
//     EACCES： (statfs())文件或路径名中包含的目录不可访问

//     EBADF ： (fstatfs()) 文件描述词无效

//     EFAULT： 内存地址无效

//     EINTR ： 操作由信号中断

//     EIO ： 读写出错

//     ELOOP ： (statfs())解释路径名过程中存在太多的符号连接

//     ENAMETOOLONG：(statfs()) 路径名太长

//     ENOENT：(statfs()) 文件不存在

//     ENOMEM： 核心内存不足

//     ENOSYS： 文件系统不支持调用

//     ENOTDIR：(statfs())路径名中当作目录的组件并非目录

//     EOVERFLOW：信息溢出